
/*


8008D53C
    地址是对话写入缓存中的，
        r29为数据地址
        [r29+0xa30-4]   为文本基址
        [r29+0xa30]     为当前写入位置
        [r29+0xA24]     为文本偏移
    从该地址修改，然后匹配剧本字符串


926b7d20为基址
    + [index+2] :为文本数据偏移

    文本数据地址 = 文本数据偏移 + [50af98 + 0x10] (为926b7d20)
        0010b706

一般对话文本都保存在
    8050A750

*/
#include <stdint.h>

typedef int32_t s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t  u8;


// uint32_t _a38;
// uint32_t _A34;

// static void proc_char(uint8_t*chp){
//     uint8_t ch = *chp;
//     uint8_t *_8047e218;
//     int a;      //写入的字符
//     if(ch<0xa6||ch>0xdf){

//     }
//     else{
//         if(_a38==0){
//             //8008D45C写入一个文字
//             //获得下一个字符
//             uint8_t ch2 = chp[1];
//             if(ch2>=0xde||ch2<0xde){
//                 //8008D3F0(,1)
//             }

//             uint8_t d = *(_8047e218 + ch - 0xa6);
//             a = 8200;

//             //一直都为0
//             if(_A34!=0){

//             }
//             if(ch==0xdf){
//                 ch = d + 2;
//                 d = ch & 0xffff;
//             }
//             else if(ch>=0xde){
//                 ch = 0x94;
//                 if(d==!0x45){
//                     ch = d + 1;
//                     ch &= 0xffff;
//                 }
//                 d = ch;
//             }
//             else if(ch>=0xde){

//             }



//             if(_A34==0){
//                 a |= d - 0x80 + 0x5f;
//             }
//             else{
//                 a |= d;
//             }
//             a &= 0xffff;
//         }
//         else{
//             //8008D340
//         }
//     }
// }

/* C:\Users\yami\Documents\Dolphin Emulator\Dump\mem1.raw (2021/5/14 7:53:46)
   起始位置(h): 0047E000, 结束位置(h): 0047E40F, 长度(h): 00000410 */

unsigned char rawData[1040] = {
	0x80, 0x08, 0xBA, 0xB0, 0x80, 0x08, 0xBA, 0xE0, 0x80, 0x08, 0xBB, 0x04,
	0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78,
	0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBC, 0x34,
	0x80, 0x08, 0xBC, 0x6C, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78,
	0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78,
	0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78,
	0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBC, 0xAC,
	0x80, 0x08, 0xBC, 0xF8, 0x80, 0x08, 0xBB, 0x78, 0x80, 0x08, 0xBD, 0xD0,
	0x80, 0x08, 0xB7, 0x78, 0x80, 0x08, 0xBB, 0x54, 0x80, 0x08, 0xBE, 0xBC,
	0x80, 0x08, 0xC4, 0x18, 0x80, 0x08, 0xC4, 0x18, 0x80, 0x08, 0xBE, 0xD0,
	0x80, 0x08, 0xBE, 0xE0, 0x80, 0x08, 0xBE, 0xE8, 0x80, 0x08, 0xBF, 0x04,
	0x80, 0x08, 0xBF, 0x20, 0x80, 0x08, 0xBF, 0x28, 0x80, 0x08, 0xBF, 0x30,
	0x80, 0x08, 0xBF, 0x3C, 0x80, 0x08, 0xBF, 0x44, 0x80, 0x08, 0xBF, 0x50,
	0x80, 0x08, 0xBF, 0x58, 0x80, 0x08, 0xBF, 0x68, 0x80, 0x08, 0xBF, 0x78,
	0x80, 0x08, 0xBF, 0x88, 0x80, 0x08, 0xBF, 0x98, 0x80, 0x08, 0xBF, 0xA8,
	0x80, 0x08, 0xBF, 0xC4, 0x80, 0x08, 0xBF, 0xD4, 0x80, 0x08, 0xBF, 0xE0,
	0x80, 0x08, 0xBF, 0xF0, 0x80, 0x08, 0xC0, 0x0C, 0x80, 0x08, 0xC0, 0x3C,
	0x80, 0x08, 0xC0, 0x58, 0x80, 0x08, 0xC0, 0x68, 0x80, 0x08, 0xC0, 0x78,
	0x80, 0x08, 0xC0, 0x80, 0x80, 0x08, 0xC0, 0x88, 0x80, 0x08, 0xC0, 0x90,
	0x80, 0x08, 0xC0, 0x98, 0x80, 0x08, 0xC0, 0xA0, 0x80, 0x08, 0xC0, 0xFC,
	0x80, 0x08, 0xC0, 0xCC, 0x80, 0x08, 0xC0, 0xDC, 0x80, 0x08, 0xC0, 0xEC,
	0x80, 0x08, 0xC1, 0x2C, 0x80, 0x08, 0xC1, 0x40, 0x80, 0x08, 0xC1, 0x54,
	0x80, 0x08, 0xC1, 0x68, 0x80, 0x08, 0xC1, 0x7C, 0x80, 0x08, 0xC1, 0xDC,
	0x80, 0x08, 0xC2, 0x3C, 0x80, 0x08, 0xC2, 0x9C, 0x80, 0x08, 0xC2, 0xE8,
	0x80, 0x08, 0xC3, 0x54, 0x80, 0x08, 0xC3, 0x74, 0x80, 0x08, 0xC4, 0x18,
	0x80, 0x08, 0xC3, 0x94, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC5, 0x08,
	0x80, 0x08, 0xC5, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC5, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x1C,
	0x80, 0x08, 0xC6, 0x1C, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC5, 0x28, 0x80, 0x08, 0xC5, 0x28,
	0x80, 0x08, 0xC5, 0x28, 0x80, 0x08, 0xC5, 0x28, 0x80, 0x08, 0xC5, 0x28,
	0x80, 0x08, 0xC5, 0x44, 0x80, 0x08, 0xC5, 0x74, 0x80, 0x08, 0xC5, 0xA0,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC5, 0x44, 0x80, 0x08, 0xC5, 0xD8,
	0x80, 0x08, 0xC5, 0xD8, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC6, 0x74, 0x80, 0x08, 0xC6, 0x08,
	0x80, 0x08, 0xC6, 0x08, 0x80, 0x08, 0xC5, 0x08, 0x80, 0x08, 0xC5, 0x28,
	0x80, 0x08, 0xCA, 0xD8, 0x80, 0x08, 0xCB, 0x04, 0x80, 0x08, 0xCB, 0x64,
	0x80, 0x08, 0xCB, 0xB0, 0x80, 0x08, 0xCC, 0x0C, 0x80, 0x08, 0xCC, 0x54,
	0x80, 0x08, 0xCC, 0x90, 0x80, 0x08, 0xCC, 0xCC, 0x92, 0x40, 0x42, 0x44,
	0x46, 0x48, 0x83, 0x85, 0x87, 0x62, 0x00, 0x41, 0x43, 0x45, 0x47, 0x49,
	0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E, 0x60,
	0x63, 0x65, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x71, 0x74, 0x77,
	0x7A, 0x7D, 0x7E, 0x80, 0x81, 0x82, 0x84, 0x86, 0x88, 0x89, 0x8A, 0x8B,
	0x8C, 0x8D, 0x8F, 0x93, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDB, 0xE0,
	0x80, 0x08, 0xDB, 0xE8, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xD9, 0xE8, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDA, 0xC4, 0x80, 0x08, 0xDA, 0xC4, 0x80, 0x08, 0xDA, 0xC4,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDA, 0xCC, 0x80, 0x08, 0xDA, 0xCC, 0x80, 0x08, 0xDB, 0x60,
	0x80, 0x08, 0xDB, 0x60, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48,
	0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDC, 0x48, 0x80, 0x08, 0xDB, 0xF0,
	0x80, 0x08, 0xDF, 0xBC, 0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74,
	0x80, 0x08, 0xE0, 0x60, 0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74,
	0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xDF, 0x88, 0x80, 0x08, 0xE0, 0x74,
	0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74,
	0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74, 0x80, 0x08, 0xE0, 0x74,
	0x80, 0x08, 0xE0, 0x40, 0x80, 0x08, 0xE0, 0x0C, 0x80, 0x08, 0xE1, 0x68,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x04, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x48, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C,
	0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x8C, 0x80, 0x08, 0xE1, 0x60,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xD1, 0xE0,
	0x80, 0x08, 0xE5, 0xE8, 0x80, 0x08, 0xE6, 0x74, 0x80, 0x08, 0xE3, 0x5C,
	0x80, 0x08, 0xD8, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x80, 0x08, 0xE7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xCE, 0xDC, 0x80, 0x08, 0xD0, 0x60,
	0x80, 0x08, 0xD0, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x63, 0x20, 0x78,
	0x80, 0x63, 0x20, 0x7A, 0x80, 0x63, 0x20, 0x7C, 0x80, 0x63, 0x20, 0x7E,
	0x80, 0x63, 0x20, 0x80, 0x80, 0x63, 0x20, 0x82, 0x80, 0x63, 0x20, 0x84,
	0x80, 0x63, 0x20, 0x87, 0x80, 0x63, 0x20, 0x8A, 0x80, 0x63, 0x20, 0x8D,
	0x80, 0x63, 0x20, 0x90, 0x80, 0x63, 0x20, 0x93
};

static int ch_pos;
static int _A34 = 0;
static int _A38 = 0;
static int write_pos;
static int _C = 0x150000;
static uint8_t write_buf[1024*1024];

#define _A24 ch_pos

static uint8_t* sub_8008D088(int read_pos,uint8_t *chp){
    if(read_pos<_C){
        return chp + read_pos;
    }
    return chp;
}

static int sub_8008D2BC(uint8_t*chp){
    //return chp[ch_pos++];
    int pos = ch_pos;
    ch_pos ++;
    return sub_8008D088(pos,chp)[0];
}

static int sub_8008D3F0(int sub_pos){
    if(sub_pos<ch_pos){
        ch_pos -= sub_pos;
    }
}

static void sub_8008D340(int ch){
    write_buf[write_pos++] = ch;
}

static void sub_8008D45C(uint8_t*chp,int last_ch){
    uint8_t ch = sub_8008D2BC(chp); //获得下一个字节
    if(ch>=0xe0||ch<0xde){
        sub_8008D3F0(1);
    }
    u8 ch2 = chp[ch_pos];
    int write_ch = 0x8200;
    if(_A34){
        write_ch = 0x8300;
    }
    uint8_t *_8047e218 = rawData + 0x218;
    uint8_t d = *(_8047e218 + last_ch - 0xa6);
    if(ch==0xdf){
        ch = d + 2;
        d = ch & 0xffff;
    }
    else if(ch<0xdf){
        if(ch>=0xde){
            ch = 0x94;
            if(d!=0x45){
                ch = d + 1;
                ch &= 0xffff;
            }
            d = ch;
        }
    }

    if(_A34==0){
        #if 0
        int a = d - 0x80;
        int b = d + 0x5f;
        write_ch |= (a - b);
        write_ch &= 0xffff;
        #else
        int a = d - 0x80;
        int b = d + 0x5f;
        //b = b - a; //?
        if(a>0){
            b = b + 1;
        }
        else{
            b = b;
        }
        write_ch |= b;
        #endif

    }
    else{
        write_ch |= d;
    }
    sub_8008D340(write_ch>>8);
    sub_8008D340(write_ch&0xff);
}

int sub_8008D9A8(uint8_t*chp,int prev_ch){
    switch (prev_ch)
    {
    case 5:{
        if(chp[ch_pos]==5&&chp[ch_pos+1]==5){
            //退出
            return 1;
        }
        if(chp[ch_pos]==5&&chp[ch_pos+1]==4){
            //未知
            ch_pos += 8;
            return 0;
        }
    }
    break;
    case 2:{
        // 02 14 33  陶谦军
        // 02 15 33  曹操军
        ch_pos += 2;
    }
    break;

    default:
        break;
    }
    return 0;
}

static void sub_8008D888(uint8_t*chp){
    int num = 0;
    for(;num<0x270f;num++){
        int ch = sub_8008D2BC(chp);
        if(ch<0x20){
            if(ch==0){
                break;
            }
            int r3 = sub_8008D9A8(chp,ch);
            if(r3!=0){
                break;
            }
        }
        else{
            if(ch<0xa6||ch>0xdf){
                sub_8008D340(ch);
                int r3 = 0;
                // if(ch<0x81||ch>0x9f){
                //     if(ch>0xe0&&ch<=0xfc){
                //         r3 = 1;
                //     }
                // }
                // else{
                //     r3 = 1;
                // }
                // if(r3!=1){

                // }
                // if(ch<0x81){
                //     goto loc_8008D938;
                // }
                // else{
                //     if(ch>0x9f){
                //         loc_8008D938:
                //         if(ch>=0xe0){
                //             if(ch<=0xfc){
                //                 r3 = 1;
                //             }
                //         }
                //     }
                // }
                // if( ch<0x9f||
                //     (ch>0xe0&&ch<=0xfc)
                // ){
                //     r3 = 1;
                // }
                if(ch>=0x81&&ch<0x9f){
                    r3 = 1;
                }
                else if(ch>0xe0&&ch<=0xfc){
                    r3 = 1;
                }

                if(r3!=0){
                    int r0 = sub_8008D2BC(chp);
                    sub_8008D340(r0);
                }
            }
            else if(_A38==0){
                sub_8008D45C(chp,ch);
            }
            else{
                sub_8008D340(ch);
            }
        }

    }
}

#include <stdio.h>
#include <stdlib.h>

static int proc(uint8_t*data){
    ch_pos = 0x27c342d - 0x26b7d20;
    write_pos = 0;
    enum{
        cc_pos = 0x26b7d20 + 0x000427ec,
    };

    ch_pos = 0x26fa506 - 0x26b7d20;

    sub_8008D888(data+0x26b7d20);
    write_buf[write_pos++] = 0;
    fprintf(stdout,"%s",write_buf);
}

static void* fdata(const char*fn){
    FILE*f = fopen(fn,"rb");
    if(!f) return 0;
    fseek(f,0,SEEK_END);
    int sz = ftell(f);
    void*d = calloc(1,sz);
    fseek(f,0,SEEK_SET);
    fread(d,1,sz,f);
    fclose(f);
    return d;
}

int main(int argc,char**argv){
    uint8_t *data = fdata(argv[1]);
    if(!data){
        fprintf(stderr,"open file error:%s\n",argv[1]);
        return -1;
    }
    proc(data);
    return 0;
}
